文档开发者中心
我的
推荐
最热
最新
其他
已解决
未解决
父子组件之间传一个复杂表单对象,父页改了字段,子组件用@Link接的输入框不回显,必须点一下才刷新,状态链路断在哪一层?

评论1

浏览 12

发布于17分钟前
         鸿蒙8.0会在Agent智能体、跨端互联、性能续航、隐私安全上继续升级,带来更自然的全场景体验。系统底层会进一步强化端侧AI,让小艺从语音助手升级为跨设备自主智能体,能够串联多个App、多台设备自动完成连贯任务,不用我们一步步手动操作,真正做到“一句话完成一件事”。        超级终端迎来大幅升级,分布式软总线延迟更低,支持更多设备无感组网。新增跨设备任务流转,手机上没做完的文档、游戏进程,可以无缝迁移到平板、PC;碰一碰传输速度提升,支持大文件后台静默同步,断点续传更稳定。        性能与续航方面,搭载全新智能调度引擎,系统根据使用习惯动态分配算力,应用冷启动更快,后台保活能力更强,待机功耗明显下降。同时游戏引擎优化,支持更多手游的高帧率、低延迟模式,针对华为自研芯片深度调优。       隐私安全上,升级星盾防护体系,新增批量加密文件统一核验,权限管控更精细,敏感数据优先在本地端侧处理,减少上传。UI交互也会更新,元服务卡片更加灵活,支持圆形、异形屏幕适配,适配更多创新形态机型。      另外,鸿蒙8.0会完善仓颉语言配套开发工具,降低开发者门槛,丰富生态。整体不再只是设备互联,而是主动感知用户需求,让鸿蒙生态更加流畅、智能。  加油华为,加油花粉!

评论0

浏览 23

发布于26分钟前
最近在一个带拍摄和视频播放的页面里,同时被相机和音频打断两个问题缠住了。表面看一个是 Camera Kit 一个是 AVPlayer,但排查下来感觉都是异步资源的状态没有串行化、播控状态没有收敛到单一事实源。先说相机这边。 用的是 XComponent + PreviewOutput,正常预览没问题。但点击切换前后摄时,预览偶尔直接黑屏,日志里报 7400105。我一开始按“资源冲突”去查,以为是旧相机没关干净,后来翻到官方错误码说明才反应过来,7400105 的原文是 Session config locked,可能原因是“另一个线程已经锁定了会话配置”,指向的是配置流程的并发/重入,而不是设备占用冲突。我的切换逻辑是在 onClick 里走完整条链路,但没做防连点,也没把 stop / release / beginConfig / commitConfig 这些异步接口严格 await 串起来。快速连点的时候,上一次的 beginConfig → commitConfig 还没结束,新的点击又进了 beginConfig,两个配置流程同时持锁,就撞上了 7400105。现在卡在切换策略上:官方给了两条路,复用旧 session,beginConfig → removeInput → addInput → commitConfig → start;或者整体 release 再 createSession。复用 session 改动小,但旧 CameraInput 必须先 await close() 释放设备,否则前后摄切换仍然会撞其他错误码;整体重建更干净,但链路更长,异步等待点更多,防连点的窗口也更大。对于“前后摄切换”这个场景,到底应该优先复用 session 还是直接整体重建?如果复用,close 旧 input 和 removeInput 的先后顺序有没有硬性要求?防连点是在 UI 层禁按钮就够了,还是必须在 Camera 管理层再加一道串行队列,防止其他入口(比如手势、外接按键)绕过 UI 触发切换?再说 AVPlayer 这边。 视频播放中被小艺语音助手打断,回来后要连续点两次播放才能继续,播控中心的按钮状态也和实际播放状态对不上。查了 Audio Kit 的打断处理文档,核心是要在 on('audioInterrupt') 里根据 InterruptEvent 的 forceType 和 hintType 做处理:INTERRUPT_FORCE + INTERRUPT_HINT_PAUSE 必须主动调 AVPlayer.pause(),否则播放器状态和系统打断状态不一致;如果接了 AVSession,还要调 setAVPlaybackState 同步播控中心。文档还提到一个细节:默认焦点策略下,INTERRUPT_HINT_RESUME 是 INTERRUPT_SHARE 类型,其余 hintType 基本都是 INTERRUPT_FORCE,所以 forceType 在某些场景下可以不做判断,但 hintType 必须严格分支。我现在的处理是收到 PAUSE 就 pause(),收到 RESUME 就 play(),但“连续点两次才恢复”说明中间某个状态没接上。RESUME 到达时,AVPlayer 可能还停在 paused 的异步转换里,直接 play() 不生效;或者 FORCE 打断时系统已经强制暂停了音频流,但 AVPlayer 自身的状态没有自动切到 paused,我记录“打断前是否在播放”的标志和播放器真实状态错位了。正确的做法是不是应该在 RESUME 回调里先查 AVPlayer.state,只有确认 paused 才调 play(),其他状态先挂起一个待恢复标记,等 on('stateChange') 落到 paused 再消费?另外,INTERRUPT_HINT_STOP 和 PAUSE 在恢复策略上的本质区别是什么——STOP 是不是意味着不应该期望 RESUME,必须走重新 prepare 的链路?这两个问题一个在相机会话配置层,一个在播放器打断恢复层,但共同点都是“异步命令发出去了,但状态确认没回来,下一发命令就撞车”。想请教一下有经验的大佬,这种场景下“串行化 + 单一事实源”的收口原则,在 Camera 的 session 切换和 AVPlayer 的打断恢复里分别应该落在哪一层,才能既不过度设计,又把偶发黑屏和双击恢复堵住?

评论3

浏览 19

发布于2小时前
如何实现组件边缘的折射效果 背景纯透明 仅边缘折射效果 并且可以根据背景的变化实时进行预览的效果 这种相果 也就是苹果的液态玻璃效果 如何在鸿蒙当中使用arkui去实现液态玻璃的效果 能否完全复刻苹果的液态玻璃效果

评论86

浏览 3.2k

发布于2026-09-05 02:57
云云
|
采纳答复
点赞10
回复于2026-09-10 06:57
我们 App 冷启动一直偏慢,中低端机上白屏两三秒是常态,偶尔还会触发启动超时提示。排查下来原因很集中:UIAbility.onCreate 里同步初始化了推送 SDK、统计 SDK、数据库打开、配置读取、网络层构建,全是阻塞调用;首屏页面的 aboutToAppear 里又同步拉广告接口和用户信息,第一帧迟迟出不来。后来按官方问答的思路,把初始化从 UIAbility.onCreate 挪到了 AppStartup 的任务图里,大致配了三个任务:BootstrapConfig 走 mainThread,DbSdkWarmup 走 taskPool 且 waitOnMainThread: false,PushRegister 设了 excludeFromAutoStart: true,等页面显示后再手动 run()。配完之后确实比原来好了一些,但首帧时延还是不稳定,有时候快有时候慢,离官方 1100ms 的参考线还有距离。我现在卡在几个地方:第一,mainThread 任务和 waitOnMainThread: false 的 taskPool 任务之间,阻塞边界到底在哪里? 官方示例里把“基础配置”放 mainThread,数据库和统计 SDK 放 taskPool 不等待。但我的 BootstrapConfig 里其实也读了一些配置、初始化了一个网络客户端,这些算不算“首帧硬依赖”?如果我把太多东西都塞进 mainThread,首帧照样被拖住;但如果挪到 taskPool,首屏页面又可能依赖这些配置,出现“首帧出来了但数据还没准备好”的空窗。这个“硬依赖”的判断标准,是按模块类型来分,还是按首屏组件实际读取的字段来倒推?第二,excludeFromAutoStart 的任务手动触发时机怎么选才不破坏首帧? 推送注册我设了不自动启动,打算等页面显示后再 run()。但实际跑下来,有时候页面显示后马上触发 run(),推送初始化反而和首帧后的首次渲染抢主线程;拖晚一点又影响推送 token 上报的时效。这个“页面显示后”的准确时机,是 onPageShow,还是首帧渲染完成的回调,还是得自己加一层空闲调度?第三,aboutToAppear 里的同步网络请求,官方建议“优先展示本地缓存,网络请求异步发起后刷新”。 但我们的首屏有骨架屏,骨架屏的占位高度又依赖接口返回的字段数量,如果先展示缓存或空骨架,数据回来后整个列表高度会跳动,体验反而更差。这种“骨架屏布局依赖接口结构”的情况,是不是只能把接口结构本地化一份,用本地结构先撑起骨架,网络回来只填内容?还是说有别的解耦方式?另外顺带问一句,startWindowIcon 的分辨率对启动耗时的影响到底有多大?我看到官方建议不超过 256×256,但我们的启动图是全屏品牌图,如果强行压到小图,居中显示会留下大片背景色,视觉上很割裂。这个取舍在实测中一般怎么权衡?

评论1

浏览 15

发布于2小时前
页面滚动位置、展开状态这类轻量 UI 状态,用 PersistentStorage 持久化,高频变更时如何减少底层 Preferences 频繁 IO?

评论7

浏览 25

发布于2小时前
DistributedDataObject 多设备同步草稿,并发修改触发冲突,除了时间戳覆盖策略,有没有更适合表单草稿的自定义合并方案?

评论5

浏览 23

发布于2小时前
设备/环境:SGT-AL10 · HarmonyOS 7.0.0.105 · API 26 · DevEco Studio(hms SDK,UIDesignKit 声明 6.1.0(23)/6.1.1(24));应用 metadata 已配置 ohos.arkui.UIMaterial.state = "enable";targetAPIVersion ≥ 26;entry 模块;系统设置"沉浸光感" = 强(最高档)。问题现象:底部导航(悬浮胶囊 + 独立圆形)由普通 ArkUI 组件(Stack/Row)通过 systemMaterial(new uiMaterial.ImmersiveMaterial(...)) 接入沉浸式系统材质。HarmonyOS 7.0.0.105 SP6 系统更新之前:胶囊呈现真实玻璃质感(折射/光晕/通透)。SP6 更新之后:同一代码、同一设备、未改任何配置——胶囊变成纯透明的卡片(背后内容直接透出,无任何材质滤镜/折射/高光;看起来就像完全没有材质)。已按官方文档验证:按"沉浸光感"官方指南示例 1 的写法复刻(Column/Stack + .backgroundColor(Color.Transparent) 写在 .systemMaterial(...) 之前 + borderRadius + 顺序正确),同样失效。按"通用组件封装"实践(ImmersiveSurface:独立组件 + BuilderParam 内容 + 透明背景 + borderRadius + clip(true) + systemMaterial 最后),同样失效。运行时探针证据(关键):deviceInfo.apiAvailable('26.0.0') = true;uiMaterial.getMaterialInfo().state = 1(≠ DISABLE)→ 应用侧门全过;new uiMaterial.ImmersiveMaterial({ style: REGULAR, materialColor: '#80FF0000', interactive: true, lightEffect: {color: undefined} }) 传入 systemMaterial 后,50% 红色 materialColor 在画面上零差异(胶囊未变粉)——证明材质滤镜完全未被渲染(不是"样式选错/背景遮挡"类问题)。对照:同一设备上,系统组件的表面(如音乐条、系统设置预览)沉浸光感正常;HDS HdsTabs 官方悬浮页签(barFloatingStyle.systemMaterialEffect,materialType/materialLevel 模式)玻璃材质正常——唯独第三方应用里自定义 ArkUI 节点的 systemMaterial 不渲染。求助点:自定义 ArkUI 组件(Stack/Row/Column 等普通容器)的 systemMaterial 在 7.0.0.105(SP6) 是否被限制/降级?是否已有已知问题或需要新的启用条件?应用侧如何判定设备的沉浸光感算力档位(低/中/高)与全局材质等级?官方指南示例 5 提到 uiMaterial.getGlobalMaterialLevel() / uiMaterial.isImmersiveMaterialSupported(),但当前 SDK 的 ArkTS 声明中不存在这两个 API(能力清单 ArkUI.json 中有声明,since 26.0.0)——这是声明回退还是需要更高 SDK 补丁?如果自定义组件的材质确实无法恢复,官方推荐的自定义底部导航正确载体是什么(HDS 已确认可用,但存在自定义页签内容/动画限制)?代码片段(完整:普通 ArkUI 组件 + 沉浸光感)以下 = 生产组件中"普通 ArkUI 组件 + 材质接入"的完整相关代码(约 120 行)。 说明:生产组件在此之上还包含滑动指示器层与手势(PanGesture 拖拽切页、按压反馈、 动画图标),与本问题无关,故省略;如需完整工程可再提供。import { uiMaterial } from '@kit.ArkUI'; import { deviceInfo } from '@kit.BasicServicesKit'; interface MainDestination { index: number; outlineSymbol: Resource; fillSymbol: Resource; label: string; } @ComponentV2 export struct BottomNav { @Param selectedIndex: number = 0 @Event onSelect: (index: number) => void = () => {} @Local materialAvailable: boolean = false private readonly mainDestinations: MainDestination[] = [ { index: 0, outlineSymbol: $r('sys.symbol.message'), fillSymbol: $r('sys.symbol.message_fill'), label: 'Chat' }, { index: 1, outlineSymbol: $r('sys.symbol.person_crop_circle_fill_1'), fillSymbol: $r('sys.symbol.person_crop_circle_fill_1'), label: 'Contacts' }, { index: 2, outlineSymbol: $r('sys.symbol.gearshape'), fillSymbol: $r('sys.symbol.gearshape_fill'), label: 'Settings' } ]; private immersiveMaterial: uiMaterial.ImmersiveMaterial | undefined = undefined; aboutToAppear(): void { try { this.materialAvailable = deviceInfo.apiAvailable('26.0.0'); if (this.materialAvailable) { const info = uiMaterial.getMaterialInfo(); this.materialAvailable = info.state !== uiMaterial.MaterialState.DISABLE; } this.immersiveMaterial = this.materialAvailable ? new uiMaterial.ImmersiveMaterial({ interactive: true, lightEffect: { color: undefined } // 注:曾显式设置 style(ULTRA_THIN/THIN/REGULAR…)逐档测试,均无视觉差异 }) : undefined; } catch (err) { this.materialAvailable = false; this.immersiveMaterial = undefined; } } private surfaceFallbackColor(): ResourceColor { // 材质可用时透明(不遮挡材质);不可用时回退半透明浅底 return this.materialAvailable ? Color.Transparent : $r('sys.color.comp_background_tertiary'); } @Builder DestinationButton(d: MainDestination) { Column({ space: 2 }) { SymbolGlyph(this.selectedIndex === d.index ? d.fillSymbol : d.outlineSymbol) .fontSize(22) .fontColor([this.selectedIndex === d.index ? $r('sys.color.icon_emphasize') : $r('sys.color.icon_primary')]) Text(d.label) .fontSize(10) .fontColor(this.selectedIndex === d.index ? $r('sys.color.icon_emphasize') : $r('sys.color.icon_primary')) } .justifyContent(FlexAlign.Center) .layoutWeight(1) .height('100%') .backgroundColor(Color.Transparent) .onClick(() => { this.onSelect(d.index); }) .accessibilityGroup(true) .accessibilityText(d.label) .accessibilitySelected(this.selectedIndex === d.index) } build() { // 普通 ArkUI 组件:透明全宽 Row 宿主,仅定位两个"普通容器表面" Row({ space: 12 }) { // 表面 1:主胶囊(共享材质实例) Stack() { Row() { ForEach(this.mainDestinations, (d: MainDestination) => { this.DestinationButton(d) }, (d: MainDestination) => `${d.index}`) } .width('100%') .height('100%') } .layoutWeight(1) .height(56) // 普通容器 + 普通属性 .borderRadius(28) .clip(true) .shadow({ radius: 24, color: 'rgba(0,0,0,0.16)', offsetX: 0, offsetY: 6 }) .backgroundColor(this.surfaceFallbackColor()) // ← 写在 systemMaterial 之前(官方顺序) .systemMaterial(this.immersiveMaterial!) // ← 通用属性接入沉浸式系统材质 // 表面 2:独立圆形(同一材质实例) Stack() { Stack() { Text('A').fontSize(22).fontWeight(FontWeight.Medium).fontColor(Color.White) } .alignContent(Alignment.Center) .width(44) .height(44) .borderRadius(22) .backgroundColor('#0A59F7') } .alignContent(Alignment.Center) .width(56) .height(56) .borderRadius(28) .clip(true) .shadow({ radius: 24, color: 'rgba(0,0,0,0.16)', offsetX: 0, offsetY: 6 }) .backgroundColor(this.surfaceFallbackColor()) .systemMaterial(this.immersiveMaterial!) .onClick(() => { this.onSelect(3); }) .accessibilityGroup(true) .accessibilityText('Profile') } .width('100%') .padding({ left: 20, right: 20 }) .margin({ bottom: this.systemInsetVp() + 8 }) // 底部安全区留白 .backgroundColor(Color.Transparent) .hitTestBehavior(HitTestMode.Transparent) } }结构说明(避免"组件不普通"的误判):全程仅使用 Stack/Row/Column/Text/SymbolGlyph + 通用属性(width/height/borderRadius/clip/shadow/backgroundColor/onClick/accessibility);唯一与系统的耦合点 = 表面的 .backgroundColor(Color.Transparent) 与 .systemMaterial(...);两个表面共享一个 uiMaterial.ImmersiveMaterial 实例(aboutToAppear 中创建)。总结:就是我在修复一个问题终于修复成功的时候然后突然发现主界面底部胶囊退化,让我非常摸不着头脑,我修改别的东西为什么会影响到底部胶囊。想来想去,唯一怀疑的线索也只有昨天下午进行的一次系统更新。

评论39

浏览 1.8k

发布于2026-08-30 02:06
半本前瞻
|
技术支持
点赞2
回复于2026-08-31 01:24
应用意图申请被拒,审核建议通过智能体或skill方式与小艺对接。当前使用skill和端插件无法实现通过小艺控制App接口发送对应的BLE命令。期望实现:用户唤醒小艺并说出指令后,小艺识别意图调用App对应功能,App通过BLE向已连接设备发送控制协议并读取状态,将结果反馈给小艺播报,必要时跳转至App控制主页查看设备状态。最开始是想用意图但被拒了,实际上后续拓展也只是模式切换不会有很复杂的操作,iOS快捷指令那样简单的触发就行,但让我用skill,但skill无法调用App,端插件上架成功了,skill也是仅上架个人,但实际上无法触发协议也没有去打开App调用协议

评论8

浏览 46

发布于3小时前
在RemoteDevice模块中,什么时候开放取消配对的接口

评论4

浏览 21

发布于3小时前
ArkUI List 高速滑动,AsyncImage 在滚动暂停后批量发起请求,如何做请求节流防止瞬间拥塞?

评论2

浏览 15

发布于3小时前
用 HdsTabs 做底部 Tab,默认看起来像有"包边"。示例代码如下所示:HdsTabs({ index: this.currentTabIndex, controller: this.tabsController }) { TabContent() { } .tabBar(this.TabTextBuilder(this.tabTitles[0], 0)) // …… } .barFloatingStyle({ barWidth: { smallWidth: 280, mediumWidth: 300, largeWidth: 320 }, barBottomMargin: 8, gradientMask: { maskColor: Color.Transparent }, lightColor: Color.Transparent, systemMaterialEffect: { materialType: hdsMaterial.MaterialType.IMMERSIVE, materialLevel: hdsMaterial.MaterialLevel.EXQUISITE } }) .barPosition(BarPosition.End) .barOverlap(true) .barBackgroundColor(Color.Transparent) .barBackgroundBlurStyle(BlurStyle.NONE) .divider({ mode: DividerMode.NONE })最终的效果是:期望的效果是,无边框线的:

评论45

浏览 844

发布于2026-09-25 09:17
云上
|
采纳答复
这个问题的根因楼上老师们已经定位了:那圈"包边"是 systemMaterialEffect 沉浸光感材质(IMMERSIVE)自带的边缘高光,和毛玻璃是捆绑效果,三档 materialLevel 只是强度差异。我补充一个还没有人提到的中间路线——用低层 API 自己叠材质,把"系统毛玻璃质感"和"边缘光感"真正解耦:思路:背景模糊用 windowBlur / backgroundEffect,而不是 barBackgroundBlurStylebarBackgroundBlurStyle 的 COMPONENT_THIN 档观感确实比系统材质弱一截(楼主实测也证实了)。想要更接近 EXQUISITE 的磨砂质感,可以试 backgroundEffect,它提供可调参数,能逼近系统材质的观感:.barBackgroundColor(Color.Transparent) .backgroundEffect({ radius: 40, // 模糊半径,调到接近 EXQUISITE 的雾面感 saturation: 1.2, // 饱和度略提,模拟系统材质的通透感 brightness: 1.05, // 轻微提亮 colorOptions: [{ color: '#80FFFFFF', cornerRadius: 28 }] // 白色薄纱 + 圆角 })这个路径出来的效果介于 COMPONENT_THIN 和系统材质之间,且不会带边缘描边,多数设计稿能对上。如果必须要系统材质:换 MaterialType 而不是降档补一个实测细节:MaterialType.IMMERSIVE(沉浸光感)是"毛玻璃+边缘光"捆绑的来源,但 hdsMaterial 里还有其他 materialType(如标准材质),不同 type 的边缘表现不一样。可以试把 materialType 换掉、materialLevel 保持 EXQUISITE,部分 type 下毛玻璃质感保留而边缘高光明显减弱,这比无脑降到 SMOOTH 更接近"只要毛玻璃"的目标。具体各 type 的视觉差异建议在真机上对照 Demo 各跑一遍(模拟器的材质渲染和真机偏差较大)。最后说下取舍楼主自己实测的结论(两者不可兼得)在"只用 systemMaterialEffect 预设"的前提下成立;但走 backgroundEffect 自绘这条路,毛玻璃 + 无边框是可以同时拿到的,只是放弃了系统材质的动态光影(点光源、按压流光)。如果产品要求的是"静态毛玻璃无包边",自绘完全够用;如果要求系统级动态光影,那只能接受边缘光或等官方提供解耦参数,可以顺手在 DevEco Studio 的 Send Feedback 里提个需求。x
点赞21
回复于2026-09-30 07:46
HarmonyOS 7 设置本地音频作为来电铃声,保存后恢复默认,该怎么排查文件路径、权限与媒体库扫描问题?

评论2

浏览 17

发布于3小时前
Stage 模型,UIAbility 被系统回收重启后,除实时校验权限外,怎么优雅封装全局权限 Hook,统一拦截敏感入口?

评论3

浏览 11

发布于3小时前
LazyForEach + @Reusable 列表高速滑动,如何精准监听滚动启停,批量暂停、恢复 AsyncImage 的网络请求?

评论2

浏览 11

发布于3小时前
鸿蒙如何为单个bundle内不同ability窗口创建多个任务栏图标

评论27

浏览 383

发布于2026-10-17 15:56
星桥似海
|
推荐答复
区分两个概念:鸿蒙 PC/2in1 上"任务栏图标"其实指两件事,楼上不少回答把它们混在一起说了,先厘清边界再给方案才不会用错。1. 任务视图(最近任务/多任务界面)里的卡片:每个 UIAbility 实例对应一张 mission 卡片,卡片的图标和标题取自该 Ability 在 module.json5 里的 icon / label。2. 屏幕底部的快捷栏(Quick Bar,俗称 Dock):那是 Desktop Extension Kit 的 quickBarManager 管理的,跟 mission 列表是两回事。楼上 13 楼说"把 Ability 分开,系统就自动注册成独立任务、在任务栏并排显示",这句话对任务视图成立,但不等于底部快捷栏会出现独立图标——多个 UIAbility 在快捷栏里默认仍归并到同一个应用入口,要分开必须显式用分组接口。这是最容易踩的坑,先把这个边界讲清楚,下面的方案才不会用错。### 一、想要任务视图里多个独立卡片:多 UIAbility 或 multiton如果目标是"后台多任务界面里每个窗口一张卡、各自图标标题",有两种做法:多个独立 UIAbility:在 module.json5 的 abilities 里声明多个 Ability,每个配自己的 icon/label。A 拉起 B 时 A 进后台但任务保留,B 是新任务,两者并存。同一个 Ability 开多个窗口:必须显式把 launchType 设为 multiton。singleton(默认)下多次 startAbility 复用同一实例,永远只有一个任务;只有 multiton 每次新建独立实例,各自占一个 mission。{ "module": { "abilities": [ { "name": "DocumentAbility", "srcEntry": "./ets/documentability/DocumentAbility.ets", "icon": "$media:doc_icon", "label": "$string:doc_label", "launchType": "multiton", "exported": true, "skills": [ { "entities": ["entity.system.home"], "actions": ["ohos.want.action.home"] } ] } ] } }注意 excludeFromMissions 只能系统应用配置生效,三方应用配了也不隐藏任务,别指望靠它"反向只留一个"。三方想要"只看到一个任务",标准是"一个 UIAbility + 多个页面",而不是藏任务。### 二、想要底部快捷栏(Dock)里按窗口分组显示独立图标:quickBarManager这才是楼主"不同窗口各自图标"最可能的真实诉求,且必须用 Desktop Extension Kit(API 23 / HarmonyOS 6.1.0 起,2in1 设备)。核心是"建分组 → 把窗口绑进分组 → 设分组图标"三步,且窗口必须先创建好才能绑定(通常在 onWindowStageCreate 拿到 windowStage 之后执行)。import { window } from '@kit.ArkUI'; import { quickBarManager } from '@kit.DeskTopExtensionKit'; import { image } from '@kit.ImageKit'; import { resourceManager } from '@kit.LocalizationKit'; import { common } from '@kit.AbilityKit'; async function setupQuickBar(ctx: common.UIAbilityContext, windowStage: window.WindowStage) { // 1. 先确认设备支持快捷栏 const supported: boolean = await quickBarManager.isQuickBarCapabilitySupported(ctx); if (!supported) { console.warn('当前设备不支持快捷栏分组'); return; } // 2. 避免重复建组报错(错误码 1020210005),先查已有分组 const groups = await quickBarManager.getQuickBarGroups(ctx); if (!groups.some(g => g.groupKey === 'editor_group')) { const rm: resourceManager.ResourceManager = ctx.resourceManager; const raw = rm.getRawFileContentSync('quickbar_editor.png'); const src = image.createImageSource(raw.buffer); const icon = await src.createPixelMap(); await quickBarManager.addQuickBarGroup(ctx, { groupKey: 'editor_group', groupIcon: icon }); } // 3. 绑定窗口:getWindowProperties().id 是 number,setWindowToGroup 要 string const mainWindow = windowStage.getMainWindowSync(); const winId = String(mainWindow.getWindowProperties().id); await quickBarManager.setWindowToGroup(ctx, winId, 'editor_group'); }两个易错点楼上提到过但要再强调:windowId 必须转成字符串(数字传进去会报 1020210006 / 1020210007);重复 addQuickBarGroup 同 groupKey 报 1020210005,先 getQuickBarGroups() 查一下。另外别用 addQuickTask()——那是加图标右键菜单项,不是分组图标,用途完全不同。### 三、组合建议只想要多窗口各自任务卡片 → 方案一无分组接口也能满足;想要底部 Dock 按窗口分独立图标 → 必须方案二 quickBarManager,且不同 Ability/window 用不同 groupKey + 不同图标;想要"同一类窗口多开且 Dock 各自图标" → 多实例(app.json5 的 multiAppMode,注意写在 app.json5 不是 module.json5,且限 2in1)配合快捷栏分组。最后,无论哪种方案,最终在目标设备上的具体排布(常驻还是折叠)由系统 UI 决定,拿到真机/2in1 上验证为准,不要仅凭"配了不同 icon 资源"就假设一定生效。
点赞6
回复于2026-10-19 09:09
有么有实操过的 flutter 鸿蒙版本的打包上架流程,手动签名之后是不是直接拿如图所示的hap 包即可,android studio 里的dart代码需要做怎样的处理?

评论3

浏览 32

发布于3小时前
小鲁班001
|
技术支持
Flutter 鸿蒙版打包上架需要区分 HAP 和 APP 两种包类型:HAP 用于真机调试安装,APP(.app 文件)才是上架应用市场的标准格式。手动签名后的 HAP 包不能直接上架,需通过 flutter build app --release 构建带签名的 .app 文件。Dart 代码本身是跨平台的,纯 Dart 业务逻辑无需改动,但需关注三方插件的鸿蒙适配版本以及 ohos 目录下的配置。【实施步骤】步骤1:准备签名文件(三件套)- 密钥库文件(.p12):在 DevEco Studio 中生成,包含公私钥对- 数字证书(.cer):在 AppGallery Connect 中申请- Profile 文件(.p7b):在 AppGallery Connect 中申请,包含包名、权限列表等步骤2:配置签名信息- 方式一(图形界面):DevEco Studio 中 文件 > 项目结构 > 签名配置,分别填入 .p12、.cer、.p7b 文件路径及密码- 方式二(配置文件):在 build-profile.json5 中配置 signingConfigs,填入 certpath、storePassword、keyAlias、keyPassword、profile、signAlg、storeFile 等字段步骤3:构建上架包(必须使用 release 模式)- 进入工程根目录执行:flutter build app --release- 构建完成后在 build/outputs/default/ 目录下获取带签名的 .app 文件- 也可在 DevEco Studio 中点击 Build > Build APP(s) 构建步骤4:上架 AppGallery Connect- 登录 AppGallery Connect,进入我的应用- 上传步骤3生成的 .app 文件- 提交审核步骤5:Dart 代码处理- 纯 Dart 业务逻辑代码可直接复用,无需针对鸿蒙做特殊处理- 三方插件需使用已适配鸿蒙的版本,纯 Dart 库可直接使用,涉及HarmonyOS能力的插件需在 ohos 目录下编写 ArkTS 侧代码- 如有平台差异化逻辑,使用 Dart 的 Platform 判断区分平台,鸿蒙端走 ohos 分支- 将 Flutter SDK 切换为鸿蒙适配版本(从 gitcode.com/CPF-Flutter/flutter_flutter 获取对应分支)【代码示例】1. 构建命令:flutter build hap --release   # 构建 release HAP(真机调试用)flutter build app --release   # 构建 release APP(上架用)2. build-profile.json5 签名配置示例:"signingConfigs": [  {    "name": "release",    "type": "HarmonyOS",    "material": {      "certpath": "xxx.cer",      "storePassword": "xxx",      "keyAlias": "release",      "keyPassword": "xxx",      "profile": "xxx.p7b",      "signAlg": "SHA256withECDSA",      "storeFile": "xxx.p12"    }  }]【参考文档】- 跨平台开发解决方案:https://developer.huawei.com/consumer/cn/doc/guidebook/solution-0000002784651007- 发布应用(打包与签名):https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hmos-publish-app- Flutter 鸿蒙适配仓库:https://gitcode.com/CPF-Flutter/flutter_flutter- 三方库适配清单:https://gitcode.com/CPF-Flutter/docs/blob/main/ThirdpartyLibrarites.md【验证方法】1. 构建完成后检查 build/outputs/default/ 目录下是否生成 .app 文件2. 将 .app 文件上传至 AppGallery Connect,确认上传成功且无格式报错3. 提交审核后关注审核状态,确认应用能正常安装启动(非 release 包会导致启动闪退被驳回)4. 真机调试阶段可先用 flutter build hap --release 生成 HAP 安装验证功能正常【注意事项】- 上架包必须使用 --release 模式构建,使用 debug 版本 flutter.har 打包会导致应用启动闪退(崩溃日志出现 SIGABRT / raise+228 / abort+20),应用市场审核会驳回- HAP 包仅用于真机调试安装,不能直接上架应用市场;APP 是应用分发的基本单位,由一个或多个 HAP 打包而成- Flutter for OpenHarmony 已适配版本:v3.7.12、v3.22.0、v3.27.4、v3.35.7、v3.41.9,建议使用最新稳定版本- 签名需使用发布证书和 Profile 文件,非调试证书- Dart 代码在 Android Studio / VS Code 中编写即可,鸿蒙配置和打包在 DevEco Studio 中打开 ohos/ 目录操作【备选方案】方案A:DevEco Studio 图形界面构建(优点:可视化操作,适合不熟悉命令行的开发者;缺点:需手动打开 ohos 目录,效率较低)方案B:Flutter 命令行构建(优点:可集成 CI/CD 流水线,效率高;缺点:需熟悉命令行和配置文件)
点赞
回复于3小时前
如果需要在自定义组件内部进行复杂的自定义布局测算, onMeasureSize 和 onPlaceChildren 接口的正确使用姿势是什么?

评论2

浏览 11

发布于3小时前
在处理父子组件嵌套时,如何优雅地解决自定义组件与外部可滚动容器(如List)之间的滑动冲突问题?

评论3

浏览 11

发布于3小时前
鸿蒙九什么时候更新呢? 有哪些新功能?桌面会不会重构或者重大改进?

评论17

浏览 295

发布于2026-10-24 13:32
长按拖拽排序列表,手指移动时用translate跟手,松手后用animateTo归位,两个机制不在同一条调度管道,松手瞬间卡片瞬移回原位或者半透明拖拽残影卡在屏幕上不消失,手势状态和属性动画怎么交接?

评论11

浏览 50

发布于5小时前
用户在元服务里浏览商品,点击"立即购买"时如果没装 App 则引导安装、已装则直接拉起 App 的商品详情页;反向地,App 里也要能把某个商品页"收藏"成元服务卡片,用户从桌面卡片点开直接进元服务详情。像这样的元服务和 App 互相拉起的 action 和 want 参数怎么写?

评论17

浏览 52

发布于6小时前
想了解一下各位开发者从事的岗位都用到了哪些好用,常用的技术栈或提供一些给后来者的一些建议,避免踩坑。也可以分享一下在这个行业中的感悟,谢谢各位!!1

评论11

浏览 89

发布于7小时前
Z
|
采纳答复
技术栈日常用的就这些:ArkTS + ArkUI 做界面,状态管理走 V2(@ComponentV2 + @Local + @Param),并发用 TaskPool 处理短任务、Worker 做长耗时,网络请求和持久化用各自的 Kit,Navigation + 系统路由表管页面跳转。这套组合能覆盖大部分业务场景。踩过的坑状态管理 V1 和 V2 别混用。这是新手最容易掉进去的坑——V1 的 @State 和 V2 的 @Local 不能用在同一个 struct 里,装饰器用错直接编译报错。新项目直接上 V2,老项目迁移时逐个组件改,别两种写法穿插着来。V2 的 @ObservedV2 + @Trace 能做深度观测,改嵌套对象的深层属性也能触发 UI 刷新,V1 做不到这点。状态管理适用场景并发别乱开线程。Worker 上限 64 个,超了创建失败。短任务用 TaskPool,它自己管理线程池,不用你操心生命周期;只有需要常驻跑的 CPU 密集型任务才用 Worker。并发方案设计Navigation 和 router 别同时用。两者是不同的路由体系,混着跳容易出白屏。新项目用 Navigation + NavPathStack + 系统路由表,这是官方推荐的路由方案。路由混用说明ArkTS 不是 TypeScript。any 被禁了,as 类型断言也有限制,动态属性访问 obj[key] 不让用。从 TS 过来的人最容易在这几个点上卡住,建议花半天把迁移指南过一遍,比编译报错再查快得多。TS 转 ArkTS 指南权限要在 module.json5 里声明,user_grant 类权限还得写 reason 和 usedScene,不然审核过不了。这个坑很多人到提测阶段才发现。给后来人的建议先搞清楚 ArkTS 的限制再动手写代码,别拿 TypeScript 的习惯硬套。状态管理一开始就选 V2,省得后面迁移。页面路由用 Navigation,别用 router。并发优先 TaskPool。遇到编译报错先查官方文档的 FAQ 区,大部分常见问题都有现成答案。这生态还在快速迭代,API 变动不算少,写代码时多留意文档里标注的"从 API version X 开始支持",别用了还不支持的接口还不知道为什么跑不通。
点赞2
回复于6小时前
API26.00有官方的反色,但是我现在是API24版本,所以在不改变API版本的情况下,怎么适配?

评论25

浏览 306

发布于2026-10-17 18:52
仙银
|
推荐答复
你说的是 HdsNavigation 标题栏那种"底层 UI 穿透上来、边缘自然消融"的渐变模糊对吧?这个不是对图片做模糊,而是标题栏区域对背后滚动内容做渐变模糊,模糊强度从底到顶逐渐减弱,所以看起来没有边界。实现方式是在 HdsNavigation 的 titleBar 里设 ScrollEffectType.GRADIENT_BLUR:import { HdsNavigation, HdsNavigationTitleMode, ScrollEffectType } from '@kit.UIDesignKit'; import { LengthMetrics } from '@kit.ArkUI'; @Entry @Component struct Index { pageInfo: NavPathStack = new NavPathStack(); scroller: Scroller = new Scroller(); build() { HdsNavigation(this.pageInfo) { Scroll(this.scroller) { Column({ space: 16 }) { ForEach([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], (item: number) => { Row() { Text('列表项 ' + item) .fontSize(18) .fontColor(Color.White) } .width('100%') .height(80) .backgroundColor('#3366CC') .borderRadius(12) }, (item: number) => item.toString()) } .padding({ left: 16, right: 16 }) } .scrollBar(BarState.Off) .width('100%') .height('100%') .clip(false) } .bindToScrollable([this.scroller]) .hideBackButton(true) .titleBar({ style: { scrollEffectOpts: { enableScrollEffect: true, scrollEffectType: ScrollEffectType.GRADIENT_BLUR, blurEffectiveStartOffset: LengthMetrics.vp(0), blurEffectiveEndOffset: LengthMetrics.vp(20) }, originalStyle: { backgroundStyle: { backgroundColor: $r('sys.color.ohos_id_color_background_transparent') } }, scrollEffectStyle: { backgroundStyle: { backgroundColor: $r('sys.color.ohos_id_color_background_transparent') } } }, content: { title: { mainTitle: '渐变模糊标题栏' } } }) .hideToolBar(true) .titleMode(HdsNavigationTitleMode.MINI) } }几个关键点:ScrollEffectType.GRADIENT_BLUR 就是渐变模糊,和 COMMON_BLUR(均匀模糊、有边界)的区别就在这。设成 GRADIENT_BLUR 后标题栏区域的模糊会渐变消融,没有硬边。clip(false) 必须给 Scroll 设,否则列表内容滚到标题栏区域会被裁掉,穿透效果就没了。如果嵌套了 Tabs,Tabs 和 TabContent 也要设 clip(false)。blurEffectiveStartOffset 和 blurEffectiveEndOffset 控制滚动多少距离后模糊效果开始和结束过渡,调这两个值可以改变模糊出现的时机。backgroundColor 用透明色,让底层内容能穿透显示。如果你想在模糊不生效时有个兜底背景色,设 blurStrategy: BlurStrategy.ADAPTIVE 即可。如果不用 HdsNavigation,想自己在普通组件上实现类似的"看到底层 UI 的渐变模糊",用 backdropBlur + linearGradient 遮罩组合:Stack() { List() { ForEach([1, 2, 3, 4, 5], (item: number) => { ListItem() { Text('item ' + item).height(60) } }, (item: number) => item.toString()) } .width('100%') .height('100%') Row() .width('100%') .height(56) .backdropBlur(20) .linearGradient({ direction: GradientDirection.Bottom, colors: [ ['rgba(255,255,255,0.6)', 0], ['rgba(255,255,255,0)', 1] ] }) }backdropBlur 模糊的是组件背后的内容(不是组件本身),配合 linearGradient 做透明度渐变,就能实现类似效果。不过推荐直接用 HdsNavigation 的 GRADIENT_BLUR,效果和性能都更好。相关文档:HdsNavigation 渐变模糊 | HdsNavigation 与 HdsTabs 滚动模糊 | 嵌套 Tabs 渐变导航穿透
点赞1
回复于2026-10-19 08:51

我要提问题

月度答复贡献榜
用户头像
橙动创意
回帖1.1k
粉丝64
关注
用户头像
Z
回帖885
粉丝14
关注
用户头像
蓝瘦的蜕变
回帖521
粉丝138
关注
用户头像
仙银
回帖510
粉丝105
关注
用户头像
飞b6
回帖509
粉丝16
关注
邀您回答
18预测:鸿蒙8.0全新功能展望,你们说有木有!?
热门标签
1

HarmonyOS 5

2

HarmonyOS 6

3

DevEco Studio

4

UI

5

HarmonyOS

6

ArkUI (方舟UI框架)

7

HarmonyOS 7

8

App开发

9

Ability框架

了解社区公约,与您携手共创和谐专业的开发者社区。
在 App 中查看